home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / music_utilities / pt030.dms / pt030.adf / Less / Src / io.c < prev    next >
C/C++ Source or Header  |  1987-06-15  |  3KB  |  173 lines

  1. /*  io.c */
  2.  
  3. #include <ctype.h>
  4.  
  5. /*
  6.  * Name:    MicroEMACS
  7.  *        AmigaDOS terminal I/O
  8.  * Version:    31
  9.  * Compiler:    Manx Aztec C
  10.  * Created:    19-Apr-86 ...!ihnp4!seismo!ut-sally!ut-ngp!mic
  11.  */
  12.  
  13. #ifdef WE_NEED_TOO
  14. #include <libraries/dos.h>
  15. #include <libraries/dosextens.h>
  16. #else
  17. #define MODE_NEWFILE 1006L
  18. #endif
  19.  
  20. #undef TRUE
  21. #undef FALSE
  22.  
  23. #define    NIBUF    128        /* Probably excessive.        */
  24. #define    NOBUF    512        /* Not too big for 750/730.    */
  25.  
  26. extern long printer;
  27. struct    FileHandle    *tty;
  28. struct    FileHandle    *Open();
  29.  
  30. char    obuf[NOBUF];    /* Output buffer        */
  31. int    nobuf;                /* # of bytes in above        */
  32. char    ibuf[NIBUF];    /* Input buffer            */
  33. int    nibuf;                /* # of bytes in above        */
  34. int    nrow = 0;            /* Terminal size, rows.        */
  35. int    ncol;                /* Terminal size, columns.    */
  36.  
  37.  
  38. extern char version[];
  39.  
  40. /*
  41.  * This routine gets called once, to set up the
  42.  * terminal channel.
  43.  */
  44. ttopen()
  45. {
  46.     char WindowName[80];
  47.  
  48.     if(nrow) return;
  49.     
  50.     nrow = 48;
  51.     ncol = 77;
  52.     nobuf = nibuf = 0;
  53.  
  54.     strcpy(WindowName,
  55. "RAW:0/0/640/400/Less 1.3 by Bob Leivian: <space> for more b-ackup h-elp q-uit &print");
  56.  
  57.     tty = Open(WindowName, MODE_NEWFILE);
  58.     if (tty == (struct FileHandle *) 0) {
  59.  
  60.         /* must not be in interlace, try 640/200 */
  61.         WindowName[12] = '2';
  62.         tty = Open(WindowName, MODE_NEWFILE);
  63.         if (tty == (struct FileHandle *) 0) {
  64.             printf("Can't open window!\n");
  65.             exit(200);
  66.         } else
  67.             nrow = 23;
  68.     }
  69. }
  70.  
  71. _abort()
  72. {
  73.     ttclose();
  74.     if (printer)
  75.         Close(printer);
  76.     exit(0);   
  77. }
  78.  
  79.  
  80. /*
  81.  * This function gets called just
  82.  * before we go back home to the command interpreter.
  83.  * On the Amiga it closes up the virtual terminal window.
  84.  */
  85. ttclose()
  86. {
  87.     if (tty != (struct FileHandle *) 0L) {
  88.         ttflush();
  89.         Close(tty);
  90.     }
  91.     tty = /*(struct FileHandle *)*/ 0L;
  92. }
  93.  
  94. /*
  95.  * Write a character to the display.
  96.  * On the Amiga, terminal output is buffered, and
  97.  * we just put the characters in the big array,
  98.  * after cheching for overflow.
  99.  */
  100. ttputc(c)
  101. {
  102.     if (nobuf >= NOBUF)
  103.         ttflush();
  104.     obuf[nobuf++] = c;
  105. }
  106.  
  107. /*
  108.  * This function does the real work of
  109.  * flushing out buffered I/O on the Amiga. All
  110.  * we do is blast out the block with a write call.
  111.  */
  112. ttflush()
  113. {
  114.     if (nobuf > 0) {
  115.         Write(tty, obuf, (long) nobuf);
  116.         nobuf = 0;
  117.     }
  118. }
  119.  
  120. /*
  121.  * Read a character from the terminal,
  122.  * performing no editing and doing conditional echo 
  123.  */
  124. int do_echo = 1; /* echo flag */
  125.  
  126. ttgetc()
  127. {
  128.     unsigned char c, ignore;    /* must be unsigned! */
  129.  
  130.     ttflush();
  131.  
  132.     Read(tty,&c,1L);
  133.     if (c == '\x9b') {
  134.         Read(tty, &c, 1L);
  135.  
  136.         /* was it a function key  */
  137.         if (isdigit(c) || c == '?')
  138.             Read(tty, &ignore, 1L);
  139.  
  140.         /* return the char with top bit set */
  141.         c |= 0x80;
  142.     } else 
  143.         if (do_echo) 
  144.             ttputc(c);
  145.  
  146.     return ((int) c);
  147. }
  148.  
  149.  
  150. /*
  151.  * Write a string to the terminal 
  152.  */
  153. ttputs(s)
  154. char *s;
  155. {
  156.     while(*s) ttputc(*s++);
  157.     ttflush();
  158. }
  159.  
  160. /* fake termcap output */
  161. tputs(s, ignore_heigth, ignore_func)
  162. char *s;
  163. int ignore_heigth, ignore_func;
  164. {
  165.     if(nrow == 0)
  166.         ttopen();
  167.  
  168.     flush();  
  169.     while(*s) ttputc(*s++);
  170.     ttflush();
  171. }
  172.  
  173.